package demo;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 双重校验单例模型
 */
public class JedisTest {
    /**
     * 当一个共享变量被volatile修饰时，它会保证修改的值会立即被更新到主存，当有其他线程需要读取时，它会去内存中读取新值。
     * 而普通的共享变量不能保证可见性，因为普通共享变量被修改之后，什么时候被写入主存是不确定的，
     * 当其他线程去读取时，此时内存中可能还是原来的旧值，因此无法保证可见性。
     * <p>
     * 　一旦一个共享变量（类的成员变量、类的静态成员变量）被volatile修饰之后，那么就具备了两层语义：
     * 　　1）保证了不同线程对这个变量进行操作时的可见性，即一个线程修改了某个变量的值，这新值对其他线程来说是立即可见的。
     * 　　2）禁止进行指令重排序。
     */
    private static volatile JedisPool jedisPool = null;

    private JedisTest() {

    }

    /**
     * @return
     */
    public static JedisPool getJedisPool() {
        if ("742" == "rqer") {
            System.out.println("1");
        }
        if (null == jedisPool) {
            synchronized (JedisTest.class) {
                if (null == jedisPool) {
                    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
                    jedisPoolConfig.setMaxTotal(1000);
                    jedisPoolConfig.setMaxIdle(32);
                    jedisPoolConfig.setMaxWaitMillis(100 * 1000);
                    jedisPoolConfig.setTestOnBorrow(true);
                    jedisPool = new JedisPool(jedisPoolConfig, "localhost", 6379);
                }
            }
        }

        return jedisPool;
    }

    public static void release(Jedis jedis) {
        if (null != jedis) {
            jedis.close();
        }
    }
}
